package com.oig.sys.msg.controller;


import com.oig.common.exception.BadRequestException;
import com.oig.common.module.SysResponse;
import com.oig.common.validator.GroupAdd;
import com.oig.common.validator.GroupEdit;
import com.oig.sys.log.annotation.SysLog;
import com.oig.sys.msg.app.IAppNoticeMsgService;
import com.oig.sys.msg.dto.NoticeMsgDto;
import com.oig.sys.msg.vo.NoticeMsgVo;
import com.oig.sys.security.util.SecurityUtil;
import io.swagger.v3.oas.annotations.Hidden;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.Parameter;
import io.swagger.v3.oas.annotations.Parameters;
import io.swagger.v3.oas.annotations.tags.Tag;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.security.access.prepost.PreAuthorize;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;

import java.util.Date;

@Tag(name = "通知公告管理")
@RestController
@RequestMapping("/noticeMsg")
@Slf4j
@RequiredArgsConstructor
public class TbNoticeMsgController {

    private final IAppNoticeMsgService appNoticeMsgService;

    /**
     * 消息后面要加推送方式，一个消息可以多种推送方式，  短信，email，站内信，企业微信，微信等等
     */
    @PreAuthorize("@pms.hasPermission('/noticeMsg/add')")
    @SysLog(value="添加消息公告",apiUrl="/noticeMsg/add")
    @Operation(summary = "添加消息公告")
    @PostMapping(value = "/add")
    public NoticeMsgVo addNoticeMsg(@RequestBody @Validated(GroupAdd.class) NoticeMsgDto noticeMsgDto){
        log.info("add msg, {}", noticeMsgDto);
        noticeMsgDto.setTenantId(SecurityUtil.getDefineUserMain().getTenantId());
        noticeMsgDto.setTenantName(SecurityUtil.getDefineUserMain().getTenantName());
        noticeMsgDto.setCreateUserId(SecurityUtil.getDefineUserMain().getId());
        noticeMsgDto.setCreateUserName(SecurityUtil.getDefineUserMain().getRealName());
        noticeMsgDto.setCreateTime(new Date());
        noticeMsgDto.setLastUpdateId(noticeMsgDto.getCreateUserId());
        noticeMsgDto.setLastUpdateName(noticeMsgDto.getCreateUserName());
        noticeMsgDto.setLastUpdateTime(noticeMsgDto.getCreateTime());
        return this.appNoticeMsgService.addNoticeMsg(noticeMsgDto);
    }



    @PreAuthorize("@pms.hasPermission('/noticeMsg/update')")
    @SysLog(value="修改消息公告",apiUrl="/noticeMsg/update")
    @Operation(summary = "修改消息公告")
    @PostMapping(value = "/update")
    public NoticeMsgVo updateNoticeMsg(@RequestBody @Validated(GroupEdit.class) NoticeMsgDto noticeMsgDto){
        log.info("update msg, {}", noticeMsgDto);
        noticeMsgDto.setLastUpdateId(SecurityUtil.getDefineUserMain().getId());
        log.debug("update user realName={}",SecurityUtil.getDefineUserMain().getRealName());
        noticeMsgDto.setLastUpdateName(SecurityUtil.getDefineUserMain().getRealName());
        noticeMsgDto.setLastUpdateTime(new Date());
        noticeMsgDto.setTenantId(SecurityUtil.getDefineUserMain().getTenantId());
        return this.appNoticeMsgService.updateNoticeMsg(noticeMsgDto);
    }


    @PreAuthorize("@pms.hasPermission('/noticeMsg/del')")
    @SysLog(value="物理删除消息公告",apiUrl="/noticeMsg/del")
    @Operation(summary = "物理删除消息公告")
    @PostMapping(value = "/del/{msgId}")
    public SysResponse<Integer> delNoticeMsg(@PathVariable("msgId") Integer msgId){
        log.info("del msg id={}", msgId) ;
        this.appNoticeMsgService.delNoticeMsg(msgId);
        return SysResponse.ok(msgId,"物理删除成功");
    }


    @PreAuthorize("@pms.hasPermission('/noticeMsg/audit')")
    @SysLog(value="消息公告复核",apiUrl="/noticeMsg/audit")
    @Operation(summary = "消息公告复核")
    @Parameters({
            @Parameter(name = "msgId", description = "消息公告id"),
            @Parameter(name = "resultType", description = "复核结果,0-驳回 1-通过"),
            @Parameter(name = "remark", description = "原因备注")
    })
    @PostMapping(value = "/audit")
    public NoticeMsgVo auditNoticeMsg(@RequestParam("msgId")Integer msgId,
                                      @RequestParam("resultType")String resultType,
                                      @RequestParam("remark")String remark){
        log.info("audit msg:{}-{}-{}", msgId, resultType, remark);
        NoticeMsgDto noticeMsgDto = new NoticeMsgDto();
        noticeMsgDto.setId(msgId);
        noticeMsgDto.setReqType(resultType);
        noticeMsgDto.setCheckRemark(remark);
        noticeMsgDto.setCheckId(SecurityUtil.getDefineUserMain().getId());
        noticeMsgDto.setCheckName(SecurityUtil.getDefineUserMain().getRealName());
        noticeMsgDto.setCheckTime(new Date());
        noticeMsgDto.setTenantId(SecurityUtil.getDefineUserMain().getTenantId());
        return appNoticeMsgService.auditNoticeMsg(noticeMsgDto);
    }

    @Operation(summary = "消息公告详细信息")
    @PostMapping(value = "/info/{msgId}")
    public NoticeMsgVo getNoticeMsg(@PathVariable("msgId") Integer msgId){
        log.info(" get msg id=:{}", msgId);
        return this.appNoticeMsgService.getNoticeMsg(msgId);
    }


    @PreAuthorize("@pms.hasPermission('/noticeMsg/publish')")
    @SysLog(value="发布消息公告",apiUrl="/noticeMsg/publish")
    @Operation(summary = "发布消息公告")
    @PostMapping(value = "/publish/{msgId}")
    public SysResponse<Integer> publishNoticeMsg(@PathVariable("msgId") Integer msgId){
        log.info("publish msg id={}", msgId) ;
        NoticeMsgDto noticeMsgDto = new NoticeMsgDto();
        noticeMsgDto.setId(msgId);
        noticeMsgDto.setPublisherId(SecurityUtil.getSys().getId());
        noticeMsgDto.setPublisherName(SecurityUtil.getSys().getRealName());
        noticeMsgDto.setPublisherTime(new Date());
        this.appNoticeMsgService.publishMsg(noticeMsgDto);
        return SysResponse.ok(msgId,"消息公告发布成功");
    }


    @Hidden
    @SysLog(value="添加系统消息",apiUrl="/noticeMsg/addSysNoticeMsg")
    @PostMapping("/addSysNoticeMsg")
    public NoticeMsgVo addSysNoticeMsg(@RequestBody @Validated(GroupAdd.class) NoticeMsgDto noticeMsgDto){
        log.info(" addSysNoticeMsg : {}",noticeMsgDto);
        //校验租户id
        if (noticeMsgDto.getTenantId()==null){
            throw new BadRequestException("所属租戶不能为空") ;
        }
        noticeMsgDto.setCreateUserName(SecurityUtil.getSys().getRealName());
        noticeMsgDto.setCreateUserId(SecurityUtil.getSys().getId());
        noticeMsgDto.setCreateTime(new Date());
        return this.appNoticeMsgService.addSysNoticeMsg(noticeMsgDto);
    }


}
